import hashlib
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from WashApp.models import Washers
from Washer.models import Users
from Washer.models import Order


# 登录检查装饰器
def login_check(fun):
    def wrap(request, *args, **kwargs):
        if 'uid' not in request.session or 'upassword' not in request.session:
            return HttpResponseRedirect('/washer/login')
        return fun(request, *args, **kwargs)

    return wrap


# 定义哈希算法处理密码的函数,传入参数为表单传递过来的密码，将密码通过hashlib.md5()方法进行处理，并返回
def setpwd(pwd):
    hash_md5 = hashlib.md5()
    hash_md5.update(pwd.encode())
    password = hash_md5.hexdigest()
    return password


# 首页
def index(request):
    return render(request, 'Washer/index.html')


# 注册
def register(request):
    if request.method == 'GET':  # get请求拿页面
        return render(request, 'Washer/register.html')  # render指向register页面
    elif request.method == 'POST':  # post请求进行逻辑处理
        # 用此方法获取页面表单中的所有数据
        r_uid = request.POST.get('userid')
        r_uname = request.POST.get('username')
        gender = request.POST.get('gender')
        r_uage = request.POST.get('age')
        pwd = request.POST.get('upwd')
        r_password = setpwd(pwd)  # 调用定义好的setpwd方法对密码通过散列算法进行处理
        r_ugender = False
        if gender == '女':  # 如果获取到的'gender'字段值为女，则ugender的值存为True，反之为默认值(False)，代表男
            r_ugender = True
        try:  # 此处要try一下，不然可能存入数据库时会发生异常
            Users.objects.create(uid=r_uid, uname=r_uname, ugender=r_ugender,  # 将所有值依次存入数据库
                                 uage=r_uage, upassword=r_password)
        except Exception as e:  # 抛出异常并返回一个静态页面
            print(e)  # 打印异常
            return HttpResponse(
                '<body style="background-color:#F5F5F5;">'
                '<div style="display:flex;justify-content:center;">'
                '<a href="/washer/register">'
                '<button type="button" style="color:red;font-size:30px;padding:100px;">'
                '注册失败！可能用户已注册 或 其他字段不合法！'
                '<br>'
                '点击返回！'
                '</button>'
                '</a>'
                '</div>'
                '</body>'
            )
        else:
            print(request, '注册成功!')  # 后台打印--方便后台开发或管理人员查看
            # # 设置session的目的是注册成功之后就可以免登陆一天(系统修改session寿命为1天后)时间
            # request.session['uid'] = r_uid
            # request.session['upassword'] = r_password
            return render(request, 'Washer/login.html')  # 注册成功之后就去到登录页面


# 登录
def login(request):
    if request.method == 'GET':
        if 'uid' in request.session and 'upassword' in request.session:  # 如果session里边有对应的数据
            return HttpResponseRedirect('/washer/myhome')  # 直接重定向到'我的'页面
        else:
            return render(request, 'Washer/login.html')  # 如果session内没有对应的数据，则跳转到登录页面
    elif request.method == 'POST':
        try:
            l_uid = request.POST.get('userid')  # 获取表单输入的用户ID
            pwd = request.POST.get('upwd')  # 获取表单输入的密码
            l_upassword = setpwd(pwd)  # 依然对明文密码处理成密文--通过md5算法
            if (l_uid == Users.objects.filter(uid=l_uid).values('uid')[0]['uid'] and l_upassword ==
                    Users.objects.filter(upassword=l_upassword).values('upassword')[0]['upassword']):
                print(request, '登录成功!')  # 后台打印--方便后台开发或管理人员查看
                # 设置session
                request.session['uid'] = l_uid
                request.session['upassword'] = l_upassword
                return HttpResponseRedirect('/washer/index')  # 重定向到首页
        except IndexError as e:  # 抛出异常并返回一个静态页面
            print(e)  # 打印异常
            return HttpResponse(
                '<body style="background-color:#F5F5F5;">'
                '<div style="display:flex;justify-content:center;">'
                '<a href="/washer/login">'
                '<button type="button" style="color:red;font-size:30px;padding:100px;">'
                '用户或密码错误！'
                '<br>'
                '点击返回！'
                '</button>'
                '</a>'
                '</div>'
                '</body>'
            )


# 退出登录
def loginout(request):
    # 如果session内有数据，则删除，然后重定向到登录页面
    if 'uid' in request.session:
        del request.session['uid']
    if 'upassword' in request.session:
        del request.session['upassword']
    return HttpResponseRedirect('/washer/login')


# 忘记密码
def forget(request):
    if request.method == 'GET':  # get拿页面
        return render(request, 'Washer/forget.html')
    elif request.method == 'POST':  # post处理数据
        f_uid = request.POST.get('userid')
        pwd = request.POST.get('upwd')
        f_password = setpwd(pwd)  # 依然要对密码通过同样的方式处理成散列码
        if Users.objects.filter(uid__exact=f_uid):  # filter(xxx__exact)是完全匹配
            Users.objects.filter(uid__exact=f_uid).update(upassword=f_password)  # 更新单条数据--密码字段
            return HttpResponseRedirect('/washer/login')
        else:  # 如果匹配不到用户，则返回一个静态页面
            return HttpResponse(
                '<body style="background-color:#F5F5F5;">'
                '<div style="display:flex;justify-content:center;">'
                '<a href="/washer/forget">'
                '<button type="button" style="color:red;font-size:30px;padding:100px;">'
                '用户不存在！'
                '<br>'
                '点击返回！'
                '</button>'
                '</a>'
                '</div>'
                '</body>'
            )


# 注销用户
def cancel(request):
    # 获取当前的用户ID，直接从数据库中删除整条记录--就注销了该用户
    current = request.session.get('uid')
    try:
        Users.objects.filter(uid=current).delete()  # 删除uid为当前session中的uid值时执行删除数据库中的记录
    except Exception as e:
        print(e)
    else:
        return render(request, 'Washer/login.html')  # 跳转到登录页面


# 订单
@login_check
def order(request):
    userid = request.session.get('uid')  # 获取当前用户ID
    wash_1 = Washers.objects.filter(wmstate=True).all()  # 查询洗衣机设备状态为True(正在使用)的所有对象并赋值给wash_1
    u_order = Order.objects.filter(user=userid)  # 用filter过滤一下第三张表，赋值给u_order--下面会使用到
    history_order = u_order.all()  # 查询到当前用户的所有订单
    wash_list = []  # 创建一个空列表
    current_order = {}  # 创建一个空字典
    try:  # 此处会发生一个因为删除了设备状态为1的订单之后查询不到值的异常
        for i in range(wash_1.count()):  # 遍历当前洗衣机设备状态为1的设备数
            wash_list.append(Washers.objects.filter(wmstate=True).values('wmid')[i]['wmid'])  # 循环向列表中添加设备ID
            current_order[i] = u_order.filter(washer=wash_list[i]).latest(
                'timer')  # 每添加一个设备ID，就向字典中添加<对象>--此处用latest('timer')是返回表中时间最新的对象
    except Exception as e:
        print(e)  # 打印异常
        return render(request, 'Washer/delwasher.html', locals())  # 跳转到注销设备页面
    else:
        return render(request, 'Washer/order.html', locals())  # 跳转到订单页面进行数据呈现


# 我的
@login_check
def myhome(request):
    # 获取当前用户uid
    current = request.session.get('uid')
    userinfo = {
        'username': Users.objects.filter(uid=current).values('uname')[0]['uname'],  # 获取当前uid对应的用户名
        'usergender': Users.objects.filter(uid=current).values('ugender')[0]['ugender'],
        'userage': Users.objects.filter(uid=current).values('uage')[0]['uage'],
    }
    # 跳转到'我的'页面，并将获取到的uid传递给该页面，那么页面中就可以显示出当前用户名
    return render(request, 'Washer/myhome.html', locals())


# 删除历史订单 谨慎操作！
def delorder(request, oid):
    Order.objects.filter(id=oid).delete()  # 从数据库中删除订单id为order视图函数传递过来的id值对应的记录
    return HttpResponseRedirect('/washer/order')  # 重定向到订单页面


# 注销洗衣机
def delwasher(request, wash_id):
    Washers.objects.filter(wmid=wash_id).delete()  # 从数据库中删除设备id为order视图函数传递过来的id值对应的记录
    return HttpResponseRedirect('/washer/order')  # 重定向到订单页面
